<template><div><h2 id="并发处理" tabindex="-1"><a class="header-anchor" href="#并发处理" aria-hidden="true">#</a> 并发处理</h2>
<nav class="table-of-contents"><ul><li><router-link to="#并发处理">并发处理</router-link></li><li><router-link to="#并发处理-1">并发处理</router-link></li><li><router-link to="#并发和并行关系">并发和并行关系</router-link></li><li><router-link to="#程序的顺序执行">程序的顺序执行</router-link></li><li><router-link to="#进程的状态">进程的状态</router-link></li><li><router-link to="#线程的状态">线程的状态</router-link></li><li><router-link to="#线程与进程的区别可以归纳为以下4点">线程与进程的区别可以归纳为以下4点：</router-link></li><li><router-link to="#进程之间的相互制约关系">进程之间的相互制约关系</router-link></li><li><router-link to="#进程互斥概念">进程互斥概念</router-link></li></ul></nav>
<p>[toc]</p>
<h2 id="并发处理-1" tabindex="-1"><a class="header-anchor" href="#并发处理-1" aria-hidden="true">#</a> 并发处理</h2>
<p><strong>1. 进程：进程就是程序在操作系统中的一次执行过程，是系统进行资源调度和分配的基本单位</strong></p>
<p><strong>2. 线程：线程是进程的一个执行实例，是程序执行的一个最小单位，它是比进程跟小能够独立完成的基本单位。</strong></p>
<blockquote>
<p>比如打开网盘，此时打开网盘是一个进程，如果我们在网盘中下载多个视频，此时下载就叫做线程，线程吃的资源更小</p>
</blockquote>
<p><strong>一个进程可以创建或者销毁多个线程，同一个进程中的多个线程可以==并发==进行</strong></p>
<p><strong>一个程序至少有一个进程，一个进程至少有一个线程</strong></p>
<h2 id="并发和并行关系" tabindex="-1"><a class="header-anchor" href="#并发和并行关系" aria-hidden="true">#</a> 并发和并行关系</h2>
<p><strong>1. 多线程程序在单核上运行，就是并发</strong></p>
<ul>
<li>从微观上看，一个时间段只有一个程序在执行</li>
</ul>
<p><strong>2. 多线程程序在多核上运行，就是并行</strong></p>
<ul>
<li>Go语言支持并行，因为并行的速度更快，在多个CPU上同时进行</li>
</ul>
<h2 id="程序的顺序执行" tabindex="-1"><a class="header-anchor" href="#程序的顺序执行" aria-hidden="true">#</a> 程序的顺序执行</h2>
<p><strong>一个计算机由若干个操作组成，而这些操作必须按照某种先后次序来执行 ，以保证操作的结果是正确的，则这类计算过程就是程序的顺序执行过程。</strong></p>
<p><strong>特性：</strong></p>
<ol>
<li><strong>顺序性</strong>
<ul>
<li>程序在处理机上严格按照所规定的循序执行的</li>
</ul>
</li>
<li><strong>封闭性</strong>
<ul>
<li>程序一旦进行，其运算结果就不受外界程序的影响，因为是一道程序独占系统各种资源</li>
</ul>
</li>
<li><strong>可再现性</strong>
<ul>
<li>程序的执行时间和它的执行速度无关（即与时间无关），而与初始条件有关、只与初始输入的有关函数</li>
</ul>
</li>
</ol>
<h2 id="进程的状态" tabindex="-1"><a class="header-anchor" href="#进程的状态" aria-hidden="true">#</a> 进程的状态</h2>
<p><strong>Pcb:</strong></p>
<p>PCB进程控制块是进程的静态描述，由PCB、有关程序段和该程序段对其进行操作的数据结构集三部分组成。</p>
<p>在Unix或类Unix系统中，进程是由进程控制块，进程执行的程序，进程执行时所用数据，进程运行使用的工作区组成。其中进程控制块是最重要的一部分。</p>
<p>进程控制块是用来描述进程的当前状态，本身特性的数据结构，是进程中组成的最关键部分，其中含有描述进程信息和控制信息，是进程的集中特性反映，是操作系统对进程具体进行识别和控制的依据。</p>
<p>PCB一般包括：</p>
<p><strong>1.程序ID（PID、进程句柄）：它是唯一的，一个进程都必须对应一个PID。PID一般是整形数字</strong></p>
<p><strong>2.特征信息：一般分系统进程、用户进程、或者内核进程等</strong></p>
<p><strong>3.进程状态：运行、就绪、阻塞，表示进程现的运行情况</strong></p>
<p><strong>4.优先级：表示获得CPU控制权的优先级大小</strong></p>
<p><strong>5.通信信息：进程之间的通信关系的反映，由于操作系统会提供通信信道</strong></p>
<p><strong>6.现场保护区：保护阻塞的进程用</strong></p>
<p><strong>7.资源需求、分配控制信息</strong></p>
<p><strong>8.进程实体信息，指明程序路径和名称，进程数据在物理内存还是在交换分区（分页）中</strong></p>
<p><strong>9.其他信息：工作单位，工作区，文件信息等</strong></p>
<p><strong>进程状态：</strong></p>
<ul>
<li>
<p><strong>就绪状态（ready）</strong></p>
</li>
<li>
<p><strong>运行状态（running）</strong></p>
</li>
<li>
<p><strong>等待状态（wait)：也称之为阻塞状态</strong></p>
<p><strong>就绪状态和等待状态都是以队列的形式等待的</strong></p>
</li>
</ul>
<blockquote>
<p><strong>创建一个进程，进程被插入到就绪状态，当一个进程完成时，可以通过撤销进程方式使进程消亡，进程转化为完成状态</strong></p>
</blockquote>
<p>2、进程状态转换</p>
<p>①就绪→执行：调度</p>
<p>②执行→等待：等待某个事件发生而睡眠</p>
<p>③等待→就绪：因等待的事件发生而唤醒</p>
<p>④执行→就绪：时间片用完或出现高优先</p>
<p><strong>就绪状态→执行状态</strong></p>
<p>处于就绪状态的进程，当进程调度程序为它分配了处理机后，该进程便由就绪状态变为执行状态，正在执行的进程也称为当前进程。</p>
<p><strong>执行状态→阻塞状态</strong></p>
<p>正在执行的进程因发生某件事件而无法执行。例如：进程请求访问临界资源，而该资源正被其它进程访问，则请求该资源的进程将由执行状态转变为阻塞状态。</p>
<p><strong>执行状态→就绪状态</strong></p>
<p>正在执行的进程，如果事件发生或中断而被暂停执行，该进程便由执行状态转变为就绪状态。（分时系统中，时间片用完；抢占调度方式中，优先权高抢占处理机）</p>
<p><strong>执行状态→终止状态</strong></p>
<p>当一个进程经完成或发生某事件，如程序中出现地址越界、非法指令等错误，而被异常结束时，进程将由执行状态转变为终止状态</p>
<h2 id="线程的状态" tabindex="-1"><a class="header-anchor" href="#线程的状态" aria-hidden="true">#</a> 线程的状态</h2>
<p><strong>线程具有以下属性：</strong></p>
<p><strong>1）轻型实体</strong>
线程中的实体基本上不拥有系统资源，只是有一点必不可少的、能保证独立运行的资源。
<strong>线程的实体包括程序、数据和TCB。线程是动态概念，它的动态特性由线程控制块TCB（Thread Control Block）描述。</strong></p>
<p><strong>TCB包括以下信息：</strong>
（1）线程状态。
（2）当线程不运行时，被保存的现场资源。
（3）一组执行堆栈。
（4）存放每个线程的局部变量主存区。
（5）访问同一个进程中的主存和其它资源。
用于指示被执行指令序列的程序计数器、保留局部变量、少数状态参数和返回地址等的一组寄存器和堆栈。</p>
<p><strong>2）独立调度和分派的基本单位。</strong>
在多线程OS中，线程是能独立运行的基本单位，因而也是独立调度和分派的基本单位。由于线程很“轻”，故线程的切换非常迅速且开销小（在同一进程中的）。</p>
<p><strong>3）可并发执行。</strong>
在一个进程中的多个线程之间，可以并发执行，甚至允许在一个进程中所有线程都能并发执行；同样，不同进程中的线程也能并发执行，充分利用和发挥了处理机与外围设备并行工作的能力。
线程
线程</p>
<p><strong>4）共享进程资源。</strong>
<strong>在同一进程中的各个线程，都可以共享该进程所拥有的资源</strong>，这首先表现在：所有线程都具有相同的地址空间（进程的地址空间），这意味着，线程可以访问该地址空间的每一个虚地址；此外，还可以访问进程所拥有的已打开文件、定时器、信号量机构等。由于同一个进程内的线程共享内存和文件，所以线程之间互相通信不必调用内核。
与进程比较编辑 播报
进程是资源分配的基本单位。所有与该进程有关的资源，都被记录在进程控制块PCB中。以表示该进程拥有这些资源或正在使用它们。</p>
<p>另外，进程也是抢占处理机的调度单位，它<strong>拥有一个完整的虚拟地址空间</strong>。<strong>当进程发生调度时，不同的进程拥有不同的虚拟地址空间，而同一进程内的不同线程共享同一地址空间。</strong></p>
<p><strong>线程</strong>
与进程相对应，线程与资源分配无关，它属于某一个进程，并与进程内的其他线程一起共享进程的资源。
线程只由相关堆栈（系统栈或用户栈）寄存器和线程控制表TCB组成。寄存器可被用来存储线程内的局部变量，但不能存储其他线程的相关变量。
通常在一个进程中可以包含若干个线程，它们可以利用进程所拥有的资源。在引入线程的操作系统中，通常都是把进程作为分配资源的基本单位，而把线程作为独立运行和独立调度的基本单位。由于线程比进程更小，基本上不拥有系统资源，故对它的调度所付出的开销就会小得多，能更高效的提高系统内多个程序间并发执行的程度，从而显著提高系统资源的利用率和吞吐量。因而近年来推出的通用操作系统都引入了线程，以便进一步提高系统的并发性，并把它视为现代操作系统的一个重要指标。</p>
<p><strong>每个进程中的内存：</strong></p>
<ol>
<li>地址空间</li>
<li>全局变量</li>
<li>打开文件</li>
<li>子进程</li>
<li>即将发生的定时器</li>
<li>信号与信号处理程序</li>
<li>账户信息</li>
</ol>
<p><strong>每个线程中的内容：</strong></p>
<ol>
<li>程序计数器（记录要执行的哪条指令）</li>
<li>寄存器 （保存线程当前的工作变量）</li>
<li>堆栈（唯一堆栈，来记录执行历史）</li>
<li>状态</li>
</ol>
<p><strong>由于线程具有进程的某些性质，所以有时被称为==轻量级线程，多线程==</strong></p>
<h2 id="线程与进程的区别可以归纳为以下4点" tabindex="-1"><a class="header-anchor" href="#线程与进程的区别可以归纳为以下4点" aria-hidden="true">#</a> 线程与进程的区别可以归纳为以下4点：</h2>
<p>1）地址空间和其它资源（如打开文件）：进程间相互独立，同一进程的各线程间共享。某进程内的线程在其它进程不可见。
2）通信：进程间通信IPC，线程间可以直接读写进程数据段（如全局变量）来进行通信——需要进程同步和互斥手段的辅助，以保证数据的一致性。
3）调度和切换：线程上下文切换比进程上下文切换要快得多。
4）在多线程OS中，进程不是一个可执行的实体。</p>
<hr>
<h2 id="进程之间的相互制约关系" tabindex="-1"><a class="header-anchor" href="#进程之间的相互制约关系" aria-hidden="true">#</a> 进程之间的相互制约关系</h2>
<blockquote>
<p>进程之间共享的系统资源必须协作，所以进程之间存在复杂的制约关系</p>
</blockquote>
<p><strong>竞争与合作</strong></p>
<blockquote>
<p><strong>进程中的制约关系分为两种情况：</strong></p>
</blockquote>
<blockquote>
<p><strong>1 .由于竞争系统资源而引发的间接相互制约关系</strong></p>
<p><strong>2 .由于进程之间存在共享数据二引起直接相互制约关系</strong></p>
</blockquote>
<p><strong>1. 各个进程之间对共享资源的使用是通过操作系统的资源管理程序来协调的，凡是使用共享资源的进程，要先向操作系统提出申请，然后由操作系统的资源管理程序根据资源的情况，按照一定的策略来实现分配</strong></p>
<p><strong>2. 解决进程之间的协作需要操作系统提供一种同步机构，各进程利用这些同步进程来使用共享数据。</strong></p>
<h2 id="进程互斥概念" tabindex="-1"><a class="header-anchor" href="#进程互斥概念" aria-hidden="true">#</a> 进程互斥概念</h2>
<ol>
<li>进程共享打印机</li>
<li>进程共享公共变量</li>
<li>进程共享公共表格</li>
</ol>
</div></template>


